﻿#pragma once

#include "common.h"
#include "seqbase/sequence.h"
#include "transform.h"
#include <vector>

namespace anip
{
	namespace vg
	{
		class Primitive : public GraphicObject, public Serializable<Primitive>
		{
			serializable_abstract;

		public:
			int length() const override { return INT_MAX; }
			//Transform transform;
			virtual bool isInside(invec2 p, float time) = 0;

			virtual ~Primitive() = default;
		};

		class VgFrameGroup : public FrameGroup
		{
			serializable_id(VgFrameGroup, 0xFF7Ed7);

		private:
			class Renderer;

		public:
			VgFrameGroup() {}
			~VgFrameGroup();

			std::vector<Primitive*> primitives;

			int length() const override { return INT_MAX; }

			GraphicsRenderer* createRenderer() override;
		};

		// ANIP_TODO: make it a FrameGroup
		//class Embedding : public Primitive
		//{
		//private:
		//	Sequence* _source;

		//public:
		//	kvec2 position = vec2{ 0, 0 };
		//	kvec2 scale = vec2{ 1, 1 };

		//	Embedding(Sequence* s = nullptr, vec2 pos = { 0, 0 }) :
		//		_source(s), position(pos) {}

		//	void onActivate()
		//	{
		//		if (_source != nullptr)
		//			_source->activate();
		//	}

		//	void onDeactivate()
		//	{
		//		if (_source != nullptr)
		//			_source->deactivate();
		//	}

		//	void setTime(float t, float rate) 
		//	{ 
		//		_time = t;
		//		if (_source != nullptr)
		//			_source->setFrame(t);
		//	}

		//	void nextFrame(float rate) 
		//	{ 
		//		_time++;
		//		if (_source != nullptr)
		//			_source->nextFrame();
		//	}

		//	void nextPresentationFrame(double realTime) 
		//	{
		//		if (_source != nullptr)
		//			_source->nextPresentationFrame();
		//	}

		//	void render(const Viewpoint& cam)
		//	{
		//		if (_source == nullptr)
		//			return;
		//		vec2 pos = position[_time];
		//		vec2 sc = scale[_time];
		//		Viewpoint v = cam;
		//		v.aspectRatio *= sc.x / sc.y;
		//		v.aspectScale *= sc.y;
		//		v.offset = v.offset + pos;

		//		_source->render(v);
		//	}

		//	bool isInside(invec2 p)
		//	{
		//		return false;

		//		// ANIP_TODO
		//	}
		//};
	}
}